Next: Macro Bindings, Previous: Dynamic Bindings, Up: Variable Bindings [Contents][Index]
These forms make let-like bindings to functions
instead of variables.
This form establishes let-style bindings on
the function cells of symbols rather than on the value cells.
Each binding must be a list of the form
‘(name arglist
forms…)’, which defines a
function exactly as if it were a cl-defun form.
The function name is defined accordingly but only
within the body of the cl-flet, hiding any
external definition if applicable.
The bindings are lexical in scope. This means that all
references to the named functions must appear physically
within the body of the cl-flet form.
Functions defined by cl-flet may use the full
Common Lisp argument notation supported by
cl-defun; also, the function body is enclosed in
an implicit block as if by cl-defun. See
Program
Structure.
Note that the cl.el version of this macro behaves slightly differently. In particular, its binding is dynamic rather than lexical. See Obsolete Macros.
The cl-labels form is like
cl-flet, except that the function bindings can
be recursive. The scoping is lexical, but you can only
capture functions in closures if lexical-binding
is t. See
Closures in GNU Emacs Lisp Reference Manual,
and
Using Lexical Binding in GNU Emacs Lisp Reference
Manual.
Lexical scoping means that all references to the named
functions must appear physically within the body of the
cl-labels form. References may appear both in
the body forms of cl-labels itself,
and in the bodies of the functions themselves. Thus,
cl-labels can define local recursive functions,
or mutually-recursive sets of functions.
A “reference” to a function name is either a
call to that function, or a use of its name quoted by
quote or function to be passed on
to, say, mapcar.
Note that the cl.el version of this macro behaves slightly differently. See Obsolete Macros.
Next: Macro Bindings, Previous: Dynamic Bindings, Up: Variable Bindings [Contents][Index]